3.2 视图函数中的其他参数
视图函数中除了request之外,还可能有其他参数,如:路径参数和自定义函数。 并且他们都是按照关键字传参的方式。交给视图函数的。
如要掌握python函数的传参,先了解以下知识点:
•位置参数
•关键字参数
•不定长参数,*args,**kwargs
request是位置参数,必须在第一个位置,如以下两个视图函数
•第1个视图函数先定义的request形参,再定义的args和kwargs, 则test1函数被调用时第一个实参会赋值给我形参request, 多余的位置实参会按照元组的形式给args,多余的关键词参数会按照字典的形式给kwargs
•第2个视图函数没有单独定义request形参,直接另一的args和kwargs, 则test2函数被调用时,所有的位置参数按照元组的形式给args,所有的关键词参数会按照字典的形式给kwargs;
使用路径转换器,或者使用re_path分组得到的路径值都会按照关键字的传参方式交给视图函数,如在path中使用路径转换器,访问的URL是:
http://127.0.0.1:8000/app03/test3/2023/12
那么kwargs这个字典就有两个键值对({“year”:2023,“month”:12}),如果把year和month单独定义在视图函数中,此时kwargs就是空字典了。补充:
•如果视图函数中,定义了request参数,那么args将永远为空元组
•路径函数中使用了kwargs也是按照关键字传参的方式交给视图函数, 且优先级大于路径转换器。
def test0(request,*args,**kwargs):
#一旦这样设置(request,*args,**kwargs),那么test1就是不定长参数,
# 无论django怎么调用test1,都不会报错,因为可以接受任何形式的传参。
# *args是位置参数,**kwargs是关键字参数。
return HttpResponse( "显示request属性" )
path函数里面的功能:
URL:
from django.urls import path
from . import views
urlpatterns = [
path( "test" ,views.test),
#一旦调用test1, 那么kwargs将会以关键字的a=100,b=200这样的形式传给test1
path( "test1" , views.test,kwargs={ "a": 100 ,"b" : 200 }),
]
views:
def test1(request, a,b): #要有对应的a、b参数来接收。
return HttpResponse( "显示request属性" )
运行后返回:
100 200
[05/May/2024 10:15:38] "GET /app03/test1 HTTP/1.1" 200 19
以上为指定参数,如果参数很多,变量也很多,则可以设置**kwargs来处理
URL:
from django.urls import path
from . import views
urlpatterns = [
path( "test" ,views.test),
#一旦调用test1, 那么kwargs将会以关键字的a=100,b=200这样的形式传给test1
path( "test1" , views.test1,kwargs={ "a" "b" , :100 : 200 } ),
]
views:
def test1(request,*args, **kwargs): # **kwargs是将所有关键字保存在**kwargs中,与urls中的kwargs不是一个东西
print (request)
print(args)
# *args 返回是一个空元组, 因为args返回是除了kwargs关键字和requset之个的位置参数
print(kwargs)
return HttpResponse( "显示request属性" )
返回:
< WSGIRequest: GET '/app03/test1'>
()
{'a': 100, 'b': 200}
[05/May/2024 10:49:32] "GET /app03/test1 HTTP/1.1" 200 19
def test1(*args, **kwargs): # 删除request
print (request)
print (args) # *args 返回是一个空元组,因为args返回是除了kwargs关键字和requset之个的位置参数
print (kwargs)
return HttpResponse( "显示request属性" )
返回:
(< WSGIRequest: GET '/app03/test1'>,)
{'a': 100, 'b': 200}
[05/May/2024 10:51:03] "GET /app03/test1 HTTP/1.1" 200 19
Test1 URL
from django.urls import path
from . import views
urlpatterns = [
path( "test" ,views.test),
#一旦调用test1,那么kwargs将会以关键字的a=100,b=200这样的形式传给test1
path( "test1" , views.test1,kwargs={ "a" : 100 , "b" : 200 }),
#test2(request,year,month)
path( "test2/<year>/<month>" , views.test2),
test2 views 只有request是按位置传参的,其他的按关键字传参
def test2(request,*args, **kwargs): # **kwargs是将所有关键字保存在**kwargs中,与urls中的kwargs不是一个东西
print(request)
print(args) # *args 返回是一个空元组,因为args返回是除了kwargs关键字和requset之个的位置参数
print(kwargs)
return HttpResponse( "显示request属性" )